home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 127_01 / rap1.c < prev    next >
Text File  |  1985-03-09  |  17KB  |  598 lines

  1. /*********************************************************************\
  2. ** .---------------------------------------------------------------. **
  3. ** |                                                               | **
  4. ** |                                                               | **
  5. ** |         Copyright (c) 1981, 1982, 1983 by Eric Martz.         | **
  6. ** |                                                               | **
  7. ** |                                                               | **
  8. ** |       Permission is hereby granted to use this source         | **
  9. ** |       code only for non-profit purposes. Publication of       | **
  10. ** |       all or any part of this source code, as well as         | **
  11. ** |       use for business purposes is forbidden without          | **
  12. ** |       written permission of the author and copyright          | **
  13. ** |       holder:                                                 | **
  14. ** |                                                               | **
  15. ** |                          Eric Martz                           | **
  16. ** |                         POWER  TOOLS                          | **
  17. ** |                    48 Hunter's Hill Circle                    | **
  18. ** |                      Amherst MA 01002 USA                     | **
  19. ** |                                                               | **
  20. ** |                                                               | **
  21. ** `---------------------------------------------------------------' **
  22. \*********************************************************************/
  23.  
  24. #include "rap.h"
  25.     
  26. /*****************************************************************
  27.     this function decodes the command type, returning the type, or
  28.         UNKNOWN.
  29. *******************************************************************/
  30. int comtyp (line)
  31.     char *line;
  32.     {
  33.     char let1, let2;
  34.  
  35.     let1  =  toupper( line[1] );
  36.     let2  =  toupper( line[2] );
  37.  
  38.     if ( let1 EQ 'A' && let2 EQ 'R')    return( AR );
  39.     if ( let1 EQ 'B' && let2 EQ 'D')    return( BD );
  40.     if ( let1 EQ 'B' && let2 EQ 'L')    return( BL );
  41.     if ( let1 EQ 'B' && let2 EQ 'O')    return( BO );
  42.     if ( let1 EQ 'B' && let2 EQ 'P')    return( BP );
  43.     if ( let1 EQ 'B' && let2 EQ 'R')    return( BR );
  44.     if ( let1 EQ 'C' && let2 EQ 'C')    return( CC );
  45.     if ( let1 EQ 'C' && let2 EQ 'E')    return( CE );
  46.     if ( let1 EQ 'C' && let2 EQ 'F')    return( CF );
  47.     if ( let1 EQ 'D' && let2 EQ '1')    return( D1 );
  48.     if ( let1 EQ 'D' && let2 EQ '2')    return( D2 );
  49. #ifdef DEBUG
  50.     if ( let1 EQ 'D' && let2 EQ 'E')    return( DEBUG );
  51. #endif
  52.     if ( let1 EQ 'E' && let2 EQ 'C')    return( EC );
  53.     if ( let1 EQ 'E' && let2 EQ 'D')    return( ED );
  54.     if ( let1 EQ 'F' && let2 EQ 'I')    return( FI );
  55.     if ( let1 EQ 'F' && let2 EQ 'O')    return( FO );
  56.     if ( let1 EQ 'F' && let2 EQ 'N')    return( FN );
  57.     if ( let1 EQ 'H' && let2 EQ 'E')    return( HE );
  58.     if ( let1 EQ 'I' && let2 EQ '@')    return( IAT);
  59.     if ( let1 EQ 'I' && let2 EQ 'C')    return( IC );
  60.     if ( let1 EQ 'I' && let2 EQ 'G')    return( IG );
  61.     if ( let1 EQ 'I' && let2 EQ 'N')    return( IN );
  62.     if ( let1 EQ 'I' && let2 EQ 'X')    return( IX );
  63.     if ( let1 EQ 'J' && let2 EQ 'U')    return( JU );
  64.     if ( let1 EQ 'L' && let2 EQ 'F')    return( LF );
  65.     if ( let1 EQ 'L' && let2 EQ 'S')    return( LS );
  66.     
  67.     if ( let1 EQ 'M') {
  68.          if (let2 EQ '1')            return( M1 );
  69.         if (let2 EQ '2')            return( M2 );
  70.         if (let2 EQ '3')            return( M3 );
  71.         if (let2 EQ '4')            return( M4 );
  72.         if (let2 EQ 'O')            return( MO );
  73.     }
  74.  
  75.     if ( let1 EQ 'N' && let2 EQ 'E')    return( NEED );
  76.     if ( let1 EQ 'N' && let2 EQ 'F')    return( NF );
  77.     if ( let1 EQ 'N' && let2 EQ 'J')    return( NJ );
  78.     if ( let1 EQ 'N' && let2 EQ 'X')    return( NX );
  79.  
  80.     if ( let1 EQ 'O' && let2 EQ 'U')    return( OU );
  81.     if ( let1 EQ 'P' && let2 EQ '#')    return( PNO );
  82.     if ( let1 EQ 'P' && let2 EQ 'D')    return( PD );
  83.     if ( let1 EQ 'P' && let2 EQ 'I')    return( PI );
  84.     if ( let1 EQ 'P' && let2 EQ 'L')    return( PL );
  85.     if ( let1 EQ 'R' && let2 EQ 'E')    return( RE );
  86.     if ( let1 EQ 'R' && let2 EQ 'M')    return( RM );
  87.     if ( let1 EQ 'R' && let2 EQ 'F')    return( RF );
  88.     if ( let1 EQ 'S' && let2 EQ 'A')    return( SA );
  89.     if ( let1 EQ 'S' && let2 EQ 'P')    return( SP );
  90.     if ( let1 EQ 'S' && let2 EQ 'S')    return( SS );
  91.     if ( let1 EQ 'T' && let2 EQ 'A')    return( TA );
  92.     if ( let1 EQ 'T' && let2 EQ 'C')    return( TC );
  93.     if ( let1 EQ 'T' && let2 EQ 'I')    return( TI );
  94.     if ( let1 EQ 'U' && let2 EQ 'L')    return( UL );
  95.  
  96.     if ( let1 EQ Pre_ss_delim &&
  97.         let2 EQ Pre_ss_delim)    return( PRE_SS );
  98.     if ( let1 EQ Post_ss_delim &&
  99.         let2 EQ Post_ss_delim)    return( POST_SS );
  100.  
  101.     return( UNKNOWN );        /* no match */
  102. }
  103. /*********************************************************************
  104.     Skips white-space characters at the beginning of a string.
  105. *********************************************************************/
  106. skip_blanks ( string )
  107.     char *string;
  108.     {
  109.     char local[ MAXLINE ];
  110.     int i, j, k;
  111.  
  112.     
  113.  
  114.     strcpy ( local, string );
  115.  
  116.     for (i = 0;
  117.         (local[i] EQ ' ' || local[i] EQ '\t' || local[i] EQ '\n');
  118.         i++);
  119.  
  120.     for (j = 0; (string[j] = local[i])  NE  '\0' ; i++, j++ )    ;
  121.  
  122.     return;
  123. }
  124.  
  125.     
  126. /*********************************************************************
  127.  
  128.     Truncates white-space characters at the end of a string.
  129.  
  130. *********************************************************************/
  131. trunc_bl (string)
  132.     char *string;
  133.     {
  134.     char *ptr;
  135.     int k;
  136.  
  137.     k  =  strlen (string);
  138.     ptr  =  &string[ k-1 ];    /* char before terminating nul */
  139.  
  140.     while (*ptr EQ BLANK || *ptr EQ TAB || *ptr EQ NEWLINE)    
  141.         *ptr--   =  '\0';
  142. }
  143.     
  144. /*******************************************************************
  145.     performs the formatting command returned by comtyp - sets global
  146.       variables ( indenting, underlining, etc. )
  147. *******************************************************************/
  148.  
  149. command (line, nx, valid)
  150.     char *line, *nx;
  151.     int *valid;
  152.     {
  153.     int c_type;    /* command type  */
  154.     int arg_val;    /* argument value, if any */
  155.     char arg_sign;    /* relative (+ or -) or absolute */
  156.     int i;
  157.  
  158.     c_type  =  comtyp (line);
  159. #ifdef DEBUG
  160.     if (Debug) fprintf(STDERR,"COMMAND %d\n",c_type);
  161. #endif
  162.  
  163.     if (c_type  EQ  UNKNOWN)    /* IGNORE ALIEN ORDERS */
  164.         {
  165.         fprintf(STDERR,
  166.             "UNKNOWN COMMAND at line %d: <%s>\n",In_linecnt,line);
  167.         *valid = NO;
  168.         return(0);
  169.     }
  170.     *valid = YES;
  171.  
  172.     arg_val  =  get_val ( line, &arg_sign );
  173. #ifdef DEBUG
  174.     if (Debug) fprintf(STDERR,
  175.         "get_val returned arg_val = %d, arg_sign =  %c   \n",
  176.         arg_val, arg_sign);
  177. #endif
  178.     switch (c_type) {
  179.  
  180.         case AR : /* assign value to arabic {#{ */
  181.             set(&Arabic, arg_val, arg_sign, 1, 0, 32000);
  182.             break;
  183.  
  184.         case TC: /* table of contents */
  185.             if (Tabcont) extract(line+4);
  186.             break;
  187.             
  188.         case IX: /* index */
  189.             if (Index) extract(line+4);
  190.             break;
  191.             
  192.         case PD: /* print draft */
  193.             set(&Printdraft, arg_val, arg_sign, 1, 0, 1);
  194.             break;
  195.             
  196.         case BD: /* begin draft */
  197.             Indraft = YES;
  198.             break;
  199.             
  200.         case ED: /* end draft */
  201.             Indraft = NO;
  202.             break;
  203.  
  204.         case FI :    /* filled lines  */
  205.             brk(CR);    /* flush out last unfilled */
  206.             Fill  =  YES;
  207.             Tival = Pival;
  208.             break;
  209.  
  210.         case NEED: /* need arg_val lines */
  211.             if ((arg_val + Lineno - 1) > Bottom) space(HUGE);
  212.             break;
  213.  
  214.         case NF :    /* non-filled lines */
  215.             brk(CR);    /* flush out */
  216.             Fill  =  NO;
  217.             Tival = Inval;
  218.             break;    /* down and cry */
  219.  
  220.         case BR :    /* just cause a break */
  221.             brk(CR);
  222.             Tival = Pival;
  223.             break;
  224.  
  225.         case LS :    /* set line spacing value */
  226.             set (&Lsval, arg_val, arg_sign, 1, 1, HUGE );
  227.             break;
  228.  
  229.         case TI :    /* set temporary left indent */
  230.             brk(CR);
  231.             set ( &Tival, arg_val, arg_sign, 5, 0, Rmval );
  232.             break;
  233.  
  234.         case PI : /* set paragraph indent */
  235.             set (&Pival, arg_val, arg_sign, Inval+5, -HUGE, HUGE);
  236.             brk(CR);
  237.             if (Fill) Tival = Pival;
  238.             break;
  239.  
  240.         case IN :    /* set left indent */
  241.             brk(CR);
  242.             set ( &Inval, arg_val, arg_sign, 0, 0, Rmval-1 );
  243.             Pival = Inval;
  244.             if (Fill) Tival = Pival;
  245.             else Tival = Inval;
  246.             break;
  247.  
  248.         case RM:    /* set right margin */
  249.             set ( &Rmval, arg_val, arg_sign, 78, Tival+1, HUGE );
  250.             break;
  251.  
  252.         case RF:    /* restore font to primary/default */
  253.             if ( /*Sanders AND*/ Font_o)
  254.